﻿Imports Microsoft.DirectX
Imports Microsoft.DirectX.Direct3D
Public Class AnimationSchocklaser
    Inherits ObjektAnimation
    Const HalteFrame As Integer = 2
    Dim Zaehler As Integer = 0
    Dim LaserReichweite As Integer
    Enum Richtungen
        Nord
        Ost
        Sued
        West
    End Enum
    Dim Richtung As Richtungen
    Public Sub New(ByVal X As Integer, ByVal Y As Integer, ByVal Musikspielen As Boolean, ByVal Schlacht As Integer)
        MyBase.New(True, Schlacht)
        Dim G As ObjektGebaeude = Objektverwalter.Spielfeld.Landschaften(X, Y, ObjektSpielfeld.Bodenschlacht).Gebaeude
        If TypeOf G Is GebaeudeSchocklaser_N Then
            Richtung = Richtungen.Nord
        ElseIf TypeOf G Is GebaeudeSchocklaser_O Then
            Richtung = Richtungen.Ost
        ElseIf TypeOf G Is GebaeudeSchocklaser_S Then
            Richtung = Richtungen.Sued
        ElseIf TypeOf G Is GebaeudeSchocklaser_W Then
            Richtung = Richtungen.West
        End If
        LaserReichweite = G.Reichweite
        P.X = X
        P.Y = Y
        If DataSettings.MusikSound Then
            MusikEngine.LoadWav(DataSettings.Resourcenpfad + "Sound\Sound Effects\Schocklaser.wav", False)
        End If
        Frames = 39
    End Sub
    Public Overrides Function Malen(ByVal intColor As System.Drawing.Color, Optional ByVal Zoomfaktor As Single = 1.0, Optional ByVal Feldbreite As Integer = -1) As Boolean
        If DataSettings.draw3D Then

        ElseIf DataSettings._2D_3D_Malen Then
            Dim SizeMax As Single = (Hauptmenue.Feldbreite * 3) / ((Frames + 1) * Hauptmenue.Feldbreite * 3)

            Dim cube(3) As CustomVertex.PositionTextured

            Dim Vec As Vector3
            Select Case Richtung
                Case Richtungen.Nord
                    cube(0) = New CustomVertex.PositionTextured(0, 0, 0, SizeMax * Frame, 0)
                    cube(1) = New CustomVertex.PositionTextured(0, 0, 3, SizeMax * Frame, 1)
                    cube(2) = New CustomVertex.PositionTextured(3, 0, 0, SizeMax * Frame + SizeMax, 0)
                    cube(3) = New CustomVertex.PositionTextured(3, 0, 3, SizeMax * Frame + SizeMax, 1)
                    Vec = ObjektSpielfeld.CalcDraw2D3DVec(P.X - 1, ObjektSpielfeld.SpielfeldLayer.Animationen, (P.Y + 1 - 2))
                Case Richtungen.Ost
                    cube(0) = New CustomVertex.PositionTextured(0, 0, 0, SizeMax * Frame, 0)
                    cube(1) = New CustomVertex.PositionTextured(0, 0, 3, SizeMax * Frame + SizeMax, 0)
                    cube(2) = New CustomVertex.PositionTextured(3, 0, 0, SizeMax * Frame, 1)
                    cube(3) = New CustomVertex.PositionTextured(3, 0, 3, SizeMax * Frame + SizeMax, 1)
                    Vec = ObjektSpielfeld.CalcDraw2D3DVec(P.X - 1 + 2, ObjektSpielfeld.SpielfeldLayer.Animationen, (P.Y + 1))
                Case Richtungen.Sued
                    cube(0) = New CustomVertex.PositionTextured(0, 0, 0, SizeMax * Frame, 1)
                    cube(1) = New CustomVertex.PositionTextured(0, 0, 3, SizeMax * Frame, 0)
                    cube(2) = New CustomVertex.PositionTextured(3, 0, 0, SizeMax * Frame + SizeMax, 1)
                    cube(3) = New CustomVertex.PositionTextured(3, 0, 3, SizeMax * Frame + SizeMax, 0)
                    Vec = ObjektSpielfeld.CalcDraw2D3DVec(P.X - 1, ObjektSpielfeld.SpielfeldLayer.Animationen, (P.Y + 1 + 1))
                Case Richtungen.West
                    cube(0) = New CustomVertex.PositionTextured(0, 0, 0, SizeMax * Frame, 1)
                    cube(1) = New CustomVertex.PositionTextured(0, 0, 3, SizeMax * Frame + SizeMax, 1)
                    cube(2) = New CustomVertex.PositionTextured(3, 0, 0, SizeMax * Frame, 0)
                    cube(3) = New CustomVertex.PositionTextured(3, 0, 3, SizeMax * Frame + SizeMax, 0)
                    Vec = ObjektSpielfeld.CalcDraw2D3DVec(P.X - 1 - 2, ObjektSpielfeld.SpielfeldLayer.Animationen, (P.Y + 1))
            End Select
            Grafikengine.malen2Din3D(Vec, cube, TexturenHalter.GetSchocklaserStart, intColor)

            If Frame >= 18 Then
                SizeMax = (Hauptmenue.Feldbreite * 3) / (Hauptmenue.Feldbreite * 3 * (Frames - 18 + 1))
                'Jetzt kommt der Strahl dran
                'Groesse 48 auf Hauptmenue.Feldbreite*2
                'Die Sng Rotation stimmt auf jeden Fall
                Select Case Richtung
                    Case Richtungen.Nord
                        For Y = -4 To -LaserReichweite - 1 Step -2
                            If Objektverwalter.Spielfeld.OnMap(P.X, P.Y + Y) Then
                                If Objektverwalter.Spielfeld.OnMap(P.X, P.Y + Y - 1) Then
                                    cube(0) = New CustomVertex.PositionTextured(0, 0, 0, SizeMax * (Frame - 18), 0)
                                    cube(1) = New CustomVertex.PositionTextured(0, 0, 2, SizeMax * (Frame - 18), 1)
                                    cube(2) = New CustomVertex.PositionTextured(3, 0, 0, SizeMax * (Frame - 18) + SizeMax, 0)
                                    cube(3) = New CustomVertex.PositionTextured(3, 0, 2, SizeMax * (Frame - 18) + SizeMax, 1)
                                    Vec = ObjektSpielfeld.CalcDraw2D3DVec(P.X - 1, ObjektSpielfeld.SpielfeldLayer.Animationen, (P.Y + Y - 1))
                                    Grafikengine.malen2Din3D(Vec, cube, TexturenHalter.GetSchocklaserStrahl, intColor)
                                Else
                                    cube(0) = New CustomVertex.PositionTextured(0, 0, 0, SizeMax * (Frame - 18), 0)
                                    cube(1) = New CustomVertex.PositionTextured(0, 0, 1, SizeMax * (Frame - 18), 1)
                                    cube(2) = New CustomVertex.PositionTextured(3, 0, 0, SizeMax * (Frame - 18) + SizeMax, 0)
                                    cube(3) = New CustomVertex.PositionTextured(3, 0, 1, SizeMax * (Frame - 18) + SizeMax, 1)
                                    Vec = ObjektSpielfeld.CalcDraw2D3DVec(P.X - 1, ObjektSpielfeld.SpielfeldLayer.Animationen, (P.Y + Y))
                                    Grafikengine.malen2Din3D(Vec, cube, TexturenHalter.GetSchocklaserStrahl, intColor)
                                    Exit For
                                End If
                            Else
                                Exit For
                            End If
                        Next
                    Case Richtungen.Sued
                        For Y = 3 To LaserReichweite + 1 Step 2
                            If Objektverwalter.Spielfeld.OnMap(P.X, P.Y + Y) Then
                                If Objektverwalter.Spielfeld.OnMap(P.X, P.Y + Y + 1) Then
                                    cube(0) = New CustomVertex.PositionTextured(0, 0, 0, SizeMax * (Frame - 18), 1)
                                    cube(1) = New CustomVertex.PositionTextured(0, 0, 2, SizeMax * (Frame - 18), 0)
                                    cube(2) = New CustomVertex.PositionTextured(3, 0, 0, SizeMax * (Frame - 18) + SizeMax, 1)
                                    cube(3) = New CustomVertex.PositionTextured(3, 0, 2, SizeMax * (Frame - 18) + SizeMax, 0)
                                    Vec = ObjektSpielfeld.CalcDraw2D3DVec(P.X - 1, ObjektSpielfeld.SpielfeldLayer.Animationen, (P.Y + Y + 1))
                                    Grafikengine.malen2Din3D(Vec, cube, TexturenHalter.GetSchocklaserStrahl, intColor)
                                Else
                                    cube(0) = New CustomVertex.PositionTextured(0, 0, 0, SizeMax * Frame, 1)
                                    cube(1) = New CustomVertex.PositionTextured(0, 0, 1, SizeMax * Frame, 0)
                                    cube(2) = New CustomVertex.PositionTextured(3, 0, 0, SizeMax * Frame + SizeMax, 1)
                                    cube(3) = New CustomVertex.PositionTextured(3, 0, 1, SizeMax * Frame + SizeMax, 0)
                                    Vec = ObjektSpielfeld.CalcDraw2D3DVec(P.X - 1, ObjektSpielfeld.SpielfeldLayer.Animationen, (P.Y + Y))
                                    Grafikengine.malen2Din3D(Vec, cube, TexturenHalter.GetSchocklaserStrahl, intColor)
                                    Exit For
                                End If
                            Else
                                Exit For
                            End If
                        Next
                    Case Richtungen.Ost
                        For X = 4 To LaserReichweite + 1 Step 2
                            If Objektverwalter.Spielfeld.OnMap(P.X + X, P.Y) Then
                                If Objektverwalter.Spielfeld.OnMap(P.X + X + 1, P.Y) Then
                                    cube(0) = New CustomVertex.PositionTextured(0, 0, 0, SizeMax * (Frame - 18), 0)
                                    cube(1) = New CustomVertex.PositionTextured(0, 0, 3, SizeMax * (Frame - 18) + SizeMax, 0)
                                    cube(2) = New CustomVertex.PositionTextured(2, 0, 0, SizeMax * (Frame - 18), 1)
                                    cube(3) = New CustomVertex.PositionTextured(2, 0, 3, SizeMax * (Frame - 18) + SizeMax, 1)
                                    Vec = ObjektSpielfeld.CalcDraw2D3DVec(P.X + X, ObjektSpielfeld.SpielfeldLayer.Animationen, (P.Y + 1))
                                    Grafikengine.malen2Din3D(Vec, cube, TexturenHalter.GetSchocklaserStrahl, intColor)
                                Else
                                    cube(0) = New CustomVertex.PositionTextured(0, 0, 0, SizeMax * (Frame - 18), 0)
                                    cube(1) = New CustomVertex.PositionTextured(0, 0, 3, SizeMax * (Frame - 18) + SizeMax, 0)
                                    cube(2) = New CustomVertex.PositionTextured(1, 0, 0, SizeMax * (Frame - 18), 1)
                                    cube(3) = New CustomVertex.PositionTextured(1, 0, 3, SizeMax * (Frame - 18) + SizeMax, 1)
                                    Vec = ObjektSpielfeld.CalcDraw2D3DVec(P.X + X, ObjektSpielfeld.SpielfeldLayer.Animationen, P.Y + 1)
                                    Grafikengine.malen2Din3D(Vec, cube, TexturenHalter.GetSchocklaserStrahl, intColor)
                                    Exit For
                                End If
                            Else
                                Exit For
                            End If
                        Next
                    Case Richtungen.West
                        For X = -4 To -LaserReichweite - 1 Step -2
                            If Objektverwalter.Spielfeld.OnMap(P.X + X, P.Y) Then
                                If Objektverwalter.Spielfeld.OnMap(P.X + X - 1, P.Y) Then
                                    cube(0) = New CustomVertex.PositionTextured(0, 0, 0, SizeMax * (Frame - 18), 1)
                                    cube(1) = New CustomVertex.PositionTextured(0, 0, 3, SizeMax * (Frame - 18) + SizeMax, 1)
                                    cube(2) = New CustomVertex.PositionTextured(2, 0, 0, SizeMax * (Frame - 18), 0)
                                    cube(3) = New CustomVertex.PositionTextured(2, 0, 3, SizeMax * (Frame - 18) + SizeMax, 0)
                                    Vec = ObjektSpielfeld.CalcDraw2D3DVec(P.X + X - 1, ObjektSpielfeld.SpielfeldLayer.Animationen, P.Y + 1)
                                    Grafikengine.malen2Din3D(Vec, cube, TexturenHalter.GetSchocklaserStrahl, intColor)
                                Else
                                    cube(0) = New CustomVertex.PositionTextured(0, 0, 0, SizeMax * (Frame - 18), 1)
                                    cube(1) = New CustomVertex.PositionTextured(0, 0, 3, SizeMax * (Frame - 18) + SizeMax, 1)
                                    cube(2) = New CustomVertex.PositionTextured(1, 0, 0, SizeMax * (Frame - 18), 0)
                                    cube(3) = New CustomVertex.PositionTextured(1, 0, 3, SizeMax * (Frame - 18) + SizeMax, 0)
                                    Vec = ObjektSpielfeld.CalcDraw2D3DVec(P.X + X, ObjektSpielfeld.SpielfeldLayer.Animationen, (P.Y + 1))
                                    Grafikengine.malen2Din3D(Vec, cube, TexturenHalter.GetSchocklaserStrahl, intColor)
                                    Exit For
                                End If
                            Else
                                Exit For
                            End If
                        Next
                End Select
            End If
        Else
            Dim sngRotation As Double = 0
            With Grafikengine.recBild
                .X = Hauptmenue.Feldbreite * 3 * Frame : .Width = Hauptmenue.Feldbreite * 3
                .Y = 0 : .Height = Hauptmenue.Feldbreite * 3
            End With
            Grafikengine.szfScale = Nothing
            Grafikengine.ptfRotCenter = New Point(Hauptmenue.Feldbreite * 3 / 2, Hauptmenue.Feldbreite * 3 / 2)
            'Zuerst malen wir den Kopf der Schocklaseranimation
            Select Case Richtung
                Case Richtungen.Nord
                    sngRotation = Math.PI
                    Grafikengine.ptfPosition = New Drawing.Point(Hauptmenue.Feldbreite * P.X + Objektverwalter.Spielfeld.BildschirmKooX, Hauptmenue.Feldbreite * P.Y + Objektverwalter.Spielfeld.BildschirmKooY - Hauptmenue.Feldbreite * 2)
                Case Richtungen.Ost
                    sngRotation = Math.PI * 1.5#
                    Grafikengine.ptfPosition = New Drawing.Point(Hauptmenue.Feldbreite * P.X + Objektverwalter.Spielfeld.BildschirmKooX + Hauptmenue.Feldbreite * 2, Hauptmenue.Feldbreite * P.Y + Objektverwalter.Spielfeld.BildschirmKooY)
                Case Richtungen.Sued
                    Grafikengine.ptfPosition = New Drawing.Point(Hauptmenue.Feldbreite * P.X + Objektverwalter.Spielfeld.BildschirmKooX, Hauptmenue.Feldbreite * P.Y + Objektverwalter.Spielfeld.BildschirmKooY + Hauptmenue.Feldbreite)
                Case Richtungen.West
                    sngRotation = Math.PI / 2
                    Grafikengine.ptfPosition = New Drawing.Point(Hauptmenue.Feldbreite * P.X + Objektverwalter.Spielfeld.BildschirmKooX - Hauptmenue.Feldbreite * 2, Hauptmenue.Feldbreite * P.Y + Objektverwalter.Spielfeld.BildschirmKooY)
            End Select
            Grafikengine.Sprite.Draw2D(TexturenHalter.GetSchocklaserStart, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)

            If Frame >= 18 Then
                'Jetzt kommt der Strahl dran
                'Groesse 48 auf Hauptmenue.Feldbreite*2
                Grafikengine.ptfRotCenter = New Point(Hauptmenue.Feldbreite * 3 / 2, Hauptmenue.Feldbreite)
                'Die Sng Rotation stimmt auf jeden Fall
                With Grafikengine.recBild
                    .X = Hauptmenue.Feldbreite * 3 * (Frame - 18) : .Width = Hauptmenue.Feldbreite * 3
                    .Y = 0 : .Height = Hauptmenue.Feldbreite * 2
                End With
                Select Case Richtung
                    Case Richtungen.Nord
                        For Y = -4 To -LaserReichweite - 1 Step -2
                            If Objektverwalter.Spielfeld.OnMap(P.X, P.Y + Y) Then
                                If Objektverwalter.Spielfeld.OnMap(P.X, P.Y + Y - 1) Then
                                    Grafikengine.ptfPosition = New Drawing.Point(Hauptmenue.Feldbreite * P.X + Objektverwalter.Spielfeld.BildschirmKooX, Hauptmenue.Feldbreite * (P.Y + Y) + Objektverwalter.Spielfeld.BildschirmKooY - Hauptmenue.Feldbreite / 2)
                                    Grafikengine.Sprite.Draw2D(TexturenHalter.GetSchocklaserStrahl, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
                                Else
                                    Grafikengine.recBild.Height = Hauptmenue.Feldbreite
                                    Grafikengine.ptfRotCenter = New Point(Hauptmenue.Feldbreite * 3 / 2, Hauptmenue.Feldbreite / 2)
                                    Grafikengine.ptfPosition = New Drawing.Point(Hauptmenue.Feldbreite * P.X + Objektverwalter.Spielfeld.BildschirmKooX, Hauptmenue.Feldbreite * (P.Y + Y) + Objektverwalter.Spielfeld.BildschirmKooY)
                                    Grafikengine.Sprite.Draw2D(TexturenHalter.GetSchocklaserStrahl, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
                                    Exit For
                                End If
                            Else
                                Exit For
                            End If
                        Next
                    Case Richtungen.Sued
                        For Y = 3 To LaserReichweite + 1 Step 2
                            If Objektverwalter.Spielfeld.OnMap(P.X, P.Y + Y) Then
                                If Objektverwalter.Spielfeld.OnMap(P.X, P.Y + Y + 1) Then
                                    Grafikengine.ptfPosition = New Drawing.Point(Hauptmenue.Feldbreite * P.X + Objektverwalter.Spielfeld.BildschirmKooX, Hauptmenue.Feldbreite * (P.Y + Y) + Objektverwalter.Spielfeld.BildschirmKooY + Hauptmenue.Feldbreite / 2)
                                    Grafikengine.Sprite.Draw2D(TexturenHalter.GetSchocklaserStrahl, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
                                Else
                                    Grafikengine.recBild.Height = Hauptmenue.Feldbreite
                                    Grafikengine.ptfRotCenter = New Point(Hauptmenue.Feldbreite * 3 / 2, Hauptmenue.Feldbreite / 2)
                                    Grafikengine.ptfPosition = New Drawing.Point(Hauptmenue.Feldbreite * P.X + Objektverwalter.Spielfeld.BildschirmKooX, Hauptmenue.Feldbreite * (P.Y + Y) + Objektverwalter.Spielfeld.BildschirmKooY)
                                    Grafikengine.Sprite.Draw2D(TexturenHalter.GetSchocklaserStrahl, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
                                    Exit For
                                End If
                            Else
                                Exit For
                            End If
                        Next
                    Case Richtungen.Ost
                        For X = 4 To LaserReichweite + 1 Step 2
                            If Objektverwalter.Spielfeld.OnMap(P.X + X, P.Y) Then
                                If Objektverwalter.Spielfeld.OnMap(P.X + X + 1, P.Y) Then
                                    Grafikengine.ptfPosition = New Drawing.Point(Hauptmenue.Feldbreite * (P.X + X) + Objektverwalter.Spielfeld.BildschirmKooX + Hauptmenue.Feldbreite / 2, Hauptmenue.Feldbreite * P.Y + Objektverwalter.Spielfeld.BildschirmKooY)
                                    Grafikengine.Sprite.Draw2D(TexturenHalter.GetSchocklaserStrahl, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
                                Else
                                    Grafikengine.recBild.Height = Hauptmenue.Feldbreite
                                    Grafikengine.ptfRotCenter = New Point(Hauptmenue.Feldbreite * 3 / 2, Hauptmenue.Feldbreite / 2)
                                    Grafikengine.ptfPosition = New Drawing.Point(Hauptmenue.Feldbreite * (P.X + X) + Objektverwalter.Spielfeld.BildschirmKooX, Hauptmenue.Feldbreite * P.Y + Objektverwalter.Spielfeld.BildschirmKooY)
                                    Grafikengine.Sprite.Draw2D(TexturenHalter.GetSchocklaserStrahl, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
                                    Exit For
                                End If
                            Else
                                Exit For
                            End If
                        Next
                    Case Richtungen.West
                        For X = -4 To -LaserReichweite - 1 Step -2
                            If Objektverwalter.Spielfeld.OnMap(P.X + X, P.Y) Then
                                If Objektverwalter.Spielfeld.OnMap(P.X + X - 1, P.Y) Then
                                    Grafikengine.ptfPosition = New Drawing.Point(Hauptmenue.Feldbreite * (P.X + X) + Objektverwalter.Spielfeld.BildschirmKooX - Hauptmenue.Feldbreite / 2, Hauptmenue.Feldbreite * P.Y + Objektverwalter.Spielfeld.BildschirmKooY)
                                    Grafikengine.Sprite.Draw2D(TexturenHalter.GetSchocklaserStrahl, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
                                Else
                                    Grafikengine.recBild.Height = Hauptmenue.Feldbreite
                                    Grafikengine.ptfRotCenter = New Point(Hauptmenue.Feldbreite * 3 / 2, Hauptmenue.Feldbreite / 2)
                                    Grafikengine.ptfPosition = New Drawing.Point(Hauptmenue.Feldbreite * (P.X + X) + Objektverwalter.Spielfeld.BildschirmKooX, Hauptmenue.Feldbreite * P.Y + Objektverwalter.Spielfeld.BildschirmKooY)
                                    Grafikengine.Sprite.Draw2D(TexturenHalter.GetSchocklaserStrahl, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
                                    Exit For
                                End If
                            Else
                                Exit For
                            End If
                        Next
                End Select

            End If
        End If
        If Frame >= Frames Then
            Return False
        End If

        If HalteFrame <= Zaehler Then
            Frame += 1
            Zaehler = 0
        Else
            Zaehler += 1
        End If

        Return True
    End Function
End Class
